package com.jpademo.dao;

import com.jpademo.pojo.Teacher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import javax.persistence.criteria.Predicate;


public interface TeacherRepository extends JpaRepository<Teacher, Long>  , JpaSpecificationExecutor {

    @Query("select t from Teacher t where t.subject = :subject")
    List<Teacher> getTeachers(@Param("subject") String subject, Sort sort);

    //正常使用，只是多加了一个 Pageable 参数而已
    @Query("select t from Teacher t where t.subject = :subject")
    Page<Teacher> getPage(@Param("subject") String subject, Pageable pageable);


/*  Predicate 是用来建立 where 后的查寻条件的相当于上述sql语句的 age > 20。
    Root 使用来定位具体的查询字段，比如 root.get(“age”) ,定位 age字段，
    CriteriaBuilder是用来构建一个字段的范围，相当于 > ,= ,<，and …. 等等
    CriteriaQuery 可以用来构建整个 sql 语句，可以指定sql 语句中的 select 后的查询字段，也可以拼接 where ， groupby 和 having 等复杂语句。*/

    //多条件查询并排序
    default List<Teacher> queryTeachersByLocation(Integer location) {
        return findAll(
                (root, query, criteriaBuilder) -> {
                    // 构建基本的查询条件
                    Predicate predicate = criteriaBuilder.equal(root.get("location"), location);
                    predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("status"), "active"));
                    // 使用 query 参数进行查询定制，例如限定返回的字段
                    query.distinct(true).select(root.get("name"));  // 假设我们只对教师的名字感兴趣
                    return predicate;
                },
                Sort.by(Sort.Order.desc("age"))
        );
    }
}

